class Integer:
    """
    一个描述器就是一个实现了三个核心的属性访问操作(get, set, delete)的类
    分别为 __get__() 、__set__() 和 __delete__() 这三个特殊的方法。 这些方法接受一个实例作为输入，之后相应的操作实例底层的字典。
    """

    def __init__(self, name):
        self.name = name

    def __get__(self, instance, cls):
        if instance is None:
            return self
        else:
            return instance.__dict__[self.name]  # self.__dict__[self.name]

    def __set__(self, instance, value):  # 设置属性,操作实例的属性，并非self的属性,比如下面的例子就是代指p
        print(instance,value)  #p 2
        if not isinstance(value, int):
            raise TypeError('Expected an int')
        instance.__dict__[self.name] = value # p.x = 2
        print('*' * 50)
        print(instance.__dict__)
        print(self.__dict__)

    def __delete__(self, instance):
        del instance.__dict__[self.name]


class Point:
    x = Integer('x')
    y = Integer('y')

    def __init__(self, x, y):
        self.x = x
        self.y = y


if __name__ == '__main__':
    p = Point(2, 3)
    print(p)
   # p.x = 3
